import { defineStore } from 'pinia'
import { createStorage } from '@/utils/Storage'
import { store } from '@/store'
import { ACCESS_TOKEN, CURRENT_USER, IS_LOCKSCREEN } from '@/store/mutation-types'
import { ResultEnum } from '@/enums/httpEnum'
const Storage = createStorage({ storage: localStorage })
import { getUserInfo, login } from '@/api/system/user'
import { storage } from '@/utils/Storage'

interface UserState {
  token: string
  username: string
  welcome: string
  avatar: string
  roles: any[]
  info: any
}

export const useUserStore = defineStore({
  id: 'app-user',
  state: (): UserState => ({
    token: Storage.get(ACCESS_TOKEN, ''),
    username: '',
    welcome: '',
    avatar: '',
    roles: [],
    info: Storage.get(CURRENT_USER, {})
  }),
  getters: {
    getToken(): string {
      return this.token
    },
    getAvatar(): string {
      return this.avatar
    },
    getNickname(): string {
      return this.username
    },
    getRoles(): [any][] {
      return this.roles
    },
    getUserInfo(): object {
      return this.info
    }
  },
  actions: {
    setToken(token: string) {
      this.token = token
    },
    setAvatar(avatar: string) {
      this.avatar = avatar
    },
    setRoles(roles) {
      this.roles = roles
    },
    setUserInfo(info) {
      this.info = info
    },
    // 登录
    async login(userInfo) {
      try {
        const response = await login(userInfo)
        const { result, code, message } = response
        if (code === ResultEnum.SUCCESS) {
          const ex = 7 * 24 * 60 * 60 * 1000
          storage.set(ACCESS_TOKEN, result.token, ex)
          storage.set(CURRENT_USER, result, ex)
          storage.set(IS_LOCKSCREEN, false)
          this.setToken(result.token)
          this.setUserInfo(result)
        }
        return Promise.resolve(response)
      } catch (e) {
        return Promise.reject(e)
      }
    },

    // 获取用户信息
    GetInfo() {
      let that = this;
      return new Promise((resolve, reject) => {
        getUserInfo().then((res) => {
          const result = res
          if (result.roles && result.roles.length) {
            const roles = result.roles
            that.setRoles(roles)
            that.setUserInfo(result)
          } else {
            reject(new Error('getInfo: roles must be a non-null array !'))
          }
          that.setAvatar(result.avatar)
          resolve(res)
        })
          .catch((error) => {
            reject(error)
          })
      })
    },

    // 登出
    async logout() {
      this.setRoles([])
      this.setUserInfo('')
      storage.remove(ACCESS_TOKEN)
      storage.remove(CURRENT_USER)
      return Promise.resolve('')
    }
  }
})

// Need to be used outside the setup
export function useUserStoreWidthOut() {
  return useUserStore(store);
}
